www.gusucode.com > 基于Visual C++高级界面特效制作百例源码程序 > 基于Visual C++高级界面特效制作百例源码程序/code/char18/PropSheet_Wizard/cstm2dlg.cpp

    // cstm2dlg.cpp : implementation file
//

#include "stdafx.h"
#include "PropSheet Wizard.h"
#include "cstm2dlg.h"
#include "PropSheet Wizardaw.h"
#include "PageDlg.h"

#ifdef _PSEUDO_DEBUG
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#ifndef TBSTYLE_TRANSPARENT
#define TBSTYLE_TRANSPARENT 0x0800
#endif	//TBSTYLE_TRANSPARENT

/////////////////////////////////////////////////////////////////////////////
// CCustom2Dlg dialog


CCustom2Dlg::CCustom2Dlg()
	: CAppWizStepDlg(CCustom2Dlg::IDD)
{
	//{{AFX_DATA_INIT(CCustom2Dlg)
	m_pageSize = 1;
	m_title = _T("");
	//}}AFX_DATA_INIT
}


void CCustom2Dlg::DoDataExchange(CDataExchange* pDX)
{
	CAppWizStepDlg::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CCustom2Dlg)
	DDX_Control(pDX, IDC_FRAME_TOOLBAR, m_frame);
	DDX_Control(pDX, IDC_LIST_PAGES, m_pages);
	DDX_Radio(pDX, IDC_RADIO_SMALLPAGES, m_pageSize);
	DDX_Text(pDX, IDC_EDIT_TITLE, m_title);
	//}}AFX_DATA_MAP
}

// This is called whenever the user presses Next, Back, or Finish with this step
//  present.  Do all validation & data exchange from the dialog in this function.
BOOL CCustom2Dlg::OnDismiss()
{
	if (!UpdateData ())
		return (FALSE);

	if (m_title.IsEmpty ())
		return (FALSE);

	DefineStringMacro (_T ("SHEET_TITLE"), m_title);

	for (int i = 0;i < m_pages.GetItemCount ();i++)
	{
		CString file;
		DefineStringMacro (_T ("PAGE_CAPTION"), i, m_pages.GetItemText (i, 0));
		DefineStringMacro (_T ("PAGE_CLASS"), i, file = m_pages.GetItemText (i, 1));
		if (file[0] == TCHAR ('C'))
			file = file.Mid (1);
		DefineStringMacro (_T ("PAGE_FILE"), i, file);
		file.SetAt (0, tolower (file[0]));
		DefineStringMacro (_T ("PAGE_VAR"), i, _T ("m_") + file);
		file.MakeUpper ();
		DefineStringMacro (_T ("PAGE_ID"), i, _T ("IDD_") + file);
		DefineStringMacro (_T ("PAGE_BMP"), i, _T ("IDB_") + file);
		if (!i)
			DefineStringMacro (_T ("PAGE_FIRST_BMP"), _T ("IDB_") + file);
		DefineIntMacro (_T ("PAGE_VAL"), i, 1000 + i);
		DefineIntMacro (_T ("PAGE_ITERATOR"), i, i + 1);
	}

	int nPages = m_pages.GetItemCount (), nClasses = nPages + 2, nIndex = nPages;
	DefineIntMacro (_T ("NUM_PAGES"), nPages);
	CString sAbout;
	if (PropSheetWizardaw.m_Dictionary.Lookup (_T ("ABOUT_BOX"), sAbout))
	{
		DefineIntMacro (_T ("ABOUT_NUM"), ++nIndex);
		nClasses++;
	}
	DefineIntMacro (_T ("NUM_CLASSES"), nClasses);
	DefineIntMacro (_T ("NUM_RESOURCES"), nClasses - 1 - !PropSheetWizardaw.m_Dictionary.Lookup (_T ("SEND_TO_TASKBAR"), sAbout));
	DefineIntMacro (_T ("MAINSHEET_NUM"), ++nIndex);
	DefineIntMacro (_T ("APP_NUM"), ++nIndex);

	DefineBoolMacro (_T ("SMALL_PAGE"), m_pageSize == 0);
	DefineBoolMacro (_T ("MEDIUM_PAGE"), m_pageSize == 1);
	DefineBoolMacro (_T ("LARGE_PAGE"), m_pageSize == 2);

	return (TRUE);	// return FALSE if the dialog shouldn't be dismissed
}

BOOL CCustom2Dlg::PreTranslateMessage (MSG* pMsg)
{
	// Let the ToolTip process this message.
	m_ctrlTooltip.RelayEvent (pMsg);

	return CAppWizStepDlg::PreTranslateMessage (pMsg);
}

BEGIN_MESSAGE_MAP(CCustom2Dlg, CAppWizStepDlg)
	//{{AFX_MSG_MAP(CCustom2Dlg)
	ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST_PAGES, OnItemchangedListPages)
	ON_COMMAND(IDC_PAGE_NEW, OnPageNew)
	ON_COMMAND(IDC_PAGE_MODIFY, OnPageModify)
	ON_COMMAND(IDC_PAGE_DELETE, OnPageDelete)
	ON_COMMAND(IDC_PAGE_MOVEUP, OnPageMoveUp)
	ON_COMMAND(IDC_PAGE_MOVEDOWN, OnPageMoveDown)
	ON_WM_PAINT()
	ON_BN_CLICKED(IDC_RADIO_LARGEPAGES, OnChangeSize)
	ON_BN_CLICKED(IDC_RADIO_MEDIUMPAGES, OnChangeSize)
	ON_BN_CLICKED(IDC_RADIO_SMALLPAGES, OnChangeSize)
	ON_NOTIFY(NM_DBLCLK, IDC_LIST_PAGES, OnDblclkListPages)
	//}}AFX_MSG_MAP
	ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTW, 0x0000, 0xFFFF, OnToolTipText)
	ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA, 0x0000, 0xFFFF, OnToolTipText)
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// CCustom2Dlg message handlers

BOOL CCustom2Dlg::OnInitDialog() 
{
	PropSheetWizardaw.m_Dictionary.Lookup (_T ("Root"), m_title);
	CAppWizStepDlg::OnInitDialog();

	// Create the ToolTip control.
	m_ctrlTooltip.Create (this);
	m_ctrlTooltip.Activate (TRUE);

	// TODO: Use one of the following forms to add controls:
	m_ctrlTooltip.AddTool (GetDlgItem (IDC_EDIT_TITLE), IDS_CUSTOM2_EDIT_TITLE_TIP);
	m_ctrlTooltip.AddTool (GetDlgItem (IDC_RADIO_SMALLPAGES), IDS_CUSTOM2_RADIO_SMALLPAGES_TIP);
	m_ctrlTooltip.AddTool (GetDlgItem (IDC_RADIO_MEDIUMPAGES), IDS_CUSTOM2_RADIO_MEDIUMPAGES_TIP);
	m_ctrlTooltip.AddTool (GetDlgItem (IDC_RADIO_LARGEPAGES), IDS_CUSTOM2_RADIO_LARGEPAGES_TIP);
	m_ctrlTooltip.AddTool (GetDlgItem (IDC_LIST_PAGES), IDS_CUSTOM2_LIST_PAGES_TIP);
	m_ctrlTooltip.AddTool (&m_toolBar, LPSTR_TEXTCALLBACK);

	m_toolBar.SetToolTips (&m_ctrlTooltip);
	CRect r;
	m_frame.GetWindowRect (r);
	CWnd *pParent = this;
	pParent->ScreenToClient (r);
	r.InflateRect (0, 2);
	m_toolBar.Create (WS_CHILD|WS_VISIBLE|CCS_NOPARENTALIGN|CCS_NODIVIDER|CCS_NORESIZE|TBSTYLE_TRANSPARENT|TBSTYLE_TOOLTIPS, r, pParent, IDR_TOOLBAR);
	m_toolBar.SetButtonSize (CSize (21, 18));
	m_toolBar.SetBitmapSize (CSize (14, 12));
	VERIFY (m_toolBar.AddBitmap (5, IDR_TOOLBAR) != -1);
	for (int i = 0;i < 5;i++)
	{
		TBBUTTON tb;
		tb.iString = 0;
		tb.fsState = TBSTATE_ENABLED;
		tb.fsStyle = TBSTYLE_BUTTON;
		tb.dwData = 0;
		tb.iBitmap = i;
		tb.idCommand = IDC_PAGE_NEW + i;
		VERIFY (m_toolBar.AddButtons (1, &tb));
	}
	m_toolBar.AutoSize ();
	m_toolBar.SetWindowPos (NULL, r.left, r.top, r.Width (), r.Height (), SWP_NOZORDER);

	m_pages.ModifyStyle (0, LVS_SHOWSELALWAYS);
	m_pages.GetClientRect (r);
	m_pages.InsertColumn (0, _T ("Page Caption"), LVCFMT_LEFT, r.Width () / 2);
	m_pages.InsertColumn (1, _T ("Page Class"), LVCFMT_LEFT, r.Width () / 2);

	m_pages.DeleteAllItems ();
	CString root, page;
	PropSheetWizardaw.m_Dictionary.Lookup (_T ("Root"), root);
	m_pages.InsertItem (0, root + _T (" Page"));
	PropSheetWizardaw.m_Dictionary.Lookup (_T ("Safe_root"), root);
	root.SetAt (0, toupper (root[0]));
	page = _T ("C") + root + _T ("Page");
	root.SetAt (0, tolower (root[0]));
	m_pages.SetItemText (0, 1, page);

	UpdateControls ();

	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CCustom2Dlg::OnItemchangedListPages(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;

	if (pNMListView->uChanged & LVIF_STATE)
		UpdateControls ();
	
	*pResult = 0;
}

void CCustom2Dlg::OnPageMoveUp() 
{
	int nSelect = m_pages.GetNextItem (-1, LVNI_SELECTED|LVNI_FOCUSED);
	if (nSelect > 0)
	{
		CString s1 = m_pages.GetItemText (nSelect, 0), s2 = m_pages.GetItemText (nSelect, 1);
		m_pages.DeleteItem (nSelect);
		nSelect = m_pages.InsertItem (nSelect - 1, s1);
		m_pages.SetItemText (nSelect, 1, s2);
		m_pages.SetItemState (nSelect, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED);
	}
	UpdateControls ();
}

void CCustom2Dlg::OnPageMoveDown() 
{
	int nSelect = m_pages.GetNextItem (-1, LVNI_SELECTED|LVNI_FOCUSED);
	if (nSelect < m_pages.GetItemCount () - 1)
	{
		CString s1 = m_pages.GetItemText (nSelect, 0), s2 = m_pages.GetItemText (nSelect, 1);
		m_pages.DeleteItem (nSelect);
		nSelect = m_pages.InsertItem (nSelect + 1, s1);
		m_pages.SetItemText (nSelect, 1, s2);
		m_pages.SetItemState (nSelect, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED);
	}
	UpdateControls ();
}

void CCustom2Dlg::OnPageNew() 
{
	CPageDlg dlg;
	if (dlg.DoModal () == IDOK)
	{
		for (int i = m_pages.GetItemCount ();--i >= 0;)
		{
			CString f1 = m_pages.GetItemText (i, 1),
					f2 = dlg.m_class;
			if (f1 == f2)
			{
				CString msg;
				AfxFormatString1 (msg, IDS_CLASS_EXIST, dlg.m_class);
				AfxMessageBox (msg, MB_OK|MB_ICONHAND);
				return;
			}
			CString szClassOld = f1;
			if (f1[0] == 'C')
				f1 = f1.Mid (1);
			if (f2[0] == 'C')
				f2 = f2.Mid (1);
			if (f1 == f2)
			{
				CString msg;
				AfxFormatString2 (msg, IDS_FILE_EXIST, f1, szClassOld);
				AfxMessageBox (msg, MB_OK|MB_ICONHAND);
				return;
			}
		}
		int nSelect = m_pages.GetNextItem (-1, LVNI_SELECTED|LVNI_FOCUSED);
		nSelect = m_pages.InsertItem (nSelect + 1, dlg.m_caption);
		m_pages.SetItemText (nSelect, 1, dlg.m_class);
		m_pages.SetItemState (nSelect, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED);
		UpdateControls ();
	}
}

void CCustom2Dlg::OnPageModify() 
{
	int nSelect = m_pages.GetNextItem (-1, LVNI_SELECTED|LVNI_FOCUSED);
	if (nSelect < 0)
		return;
	CPageDlg dlg;
	dlg.m_caption = m_pages.GetItemText (nSelect, 0);
	dlg.m_class = m_pages.GetItemText (nSelect, 1);
	if (dlg.DoModal () == IDOK)
	{
		for (int i = m_pages.GetItemCount ();--i >= 0;)
		{
			if (i == nSelect)
				continue;
			CString f1 = m_pages.GetItemText (i, 1),
					f2 = dlg.m_class;
			if (f1 == f2)
			{
				CString msg;
				AfxFormatString1 (msg, IDS_CLASS_EXIST, dlg.m_class);
				AfxMessageBox (msg, MB_OK|MB_ICONHAND);
				return;
			}
			CString szClassOld = f1;
			if (f1[0] == 'C')
				f1 = f1.Mid (1);
			if (f2[0] == 'C')
				f2 = f2.Mid (1);
			if (f1 == f2)
			{
				CString msg;
				AfxFormatString2 (msg, IDS_FILE_EXIST, f1, szClassOld);
				AfxMessageBox (msg, MB_OK|MB_ICONHAND);
				return;
			}
		}
		m_pages.SetItemText (nSelect, 0, dlg.m_caption);
		m_pages.SetItemText (nSelect, 1, dlg.m_class);
		m_pages.SetItemState (nSelect, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED);
		UpdateControls ();
	}
}

void CCustom2Dlg::OnPageDelete() 
{
	int nSelect = m_pages.GetNextItem (-1, LVNI_SELECTED|LVNI_FOCUSED);
	if (nSelect >= 0)
	{
		m_pages.DeleteItem (nSelect);
		m_pages.SetItemState (nSelect, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED);
		if (nSelect >= m_pages.GetItemCount ())
			nSelect = m_pages.GetItemCount () - 1;
		if (nSelect >= 0)
			m_pages.SetItemState (nSelect, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED);
		UpdateControls ();
	}
}

void CCustom2Dlg::UpdateControls ()
{
	int nSelect = m_pages.GetNextItem (-1, LVNI_SELECTED);
	m_toolBar.EnableButton (IDC_PAGE_MODIFY, nSelect >= 0);
	m_toolBar.EnableButton (IDC_PAGE_DELETE, nSelect >= 0 && m_pages.GetItemCount () > 1);
	m_toolBar.EnableButton (IDC_PAGE_MOVEUP, nSelect > 0);
	m_toolBar.EnableButton (IDC_PAGE_MOVEDOWN, nSelect >= 0 && nSelect < m_pages.GetItemCount () - 1);
}

#define STEP2_LEFT				8
#define STEP2_TOP				72
#define STEP2_WIDTH				179
#define STEP2_HEIGHT			180

// Coordinates for yellow rectangle in dialog-box units
#define RIGHT_YELLOW_DLGU	124
#define BOTTOM_YELLOW_DLGU	197

void CCustom2Dlg::OnPaint() 
{
	CPaintDC dc(this); // device context for painting

	CDC mdc;
	mdc.CreateCompatibleDC (&dc);
	
	CRect rect (0, 0, RIGHT_YELLOW_DLGU+1, BOTTOM_YELLOW_DLGU+1);
	MapDialogRect (&rect);
	dc.DPtoLP (&rect);
	CBitmap bmp, *ob;
	bmp.CreateCompatibleBitmap (&dc, rect.right, rect.bottom);
	ob = mdc.SelectObject (&bmp);
	PaintBackground (mdc, this);
	UINT nBmpID;
	switch (m_pageSize)
	{
	case 0:
		nBmpID = IDB_STEP2SMALL;
		break;
	case 2:
		nBmpID = IDB_STEP2LARGE;
		break;
	default:
		nBmpID = IDB_STEP2MEDIUM;
		break;
	}
	PaintBitmap (nBmpID, STEP2_LEFT, STEP2_TOP, STEP2_WIDTH, STEP2_HEIGHT, mdc);
	dc.BitBlt (rect.left, rect.top, rect.Width (), rect.Height (), &mdc, rect.left, rect.top, SRCCOPY);
	mdc.SelectObject (ob);
}

void CCustom2Dlg::OnChangeSize() 
{
	if (UpdateData ())
	{
		// Invalidate the portion of this dialog on which we draw the picture
		CRect rect (STEP2_LEFT, STEP2_TOP, STEP2_LEFT + STEP2_WIDTH, STEP2_TOP + STEP2_HEIGHT);
		InvalidateRect (rect, FALSE);
		RedrawWindow (rect, NULL, RDW_UPDATENOW);
		UpdateControls ();
	}
}

void CCustom2Dlg::OnDblclkListPages(NMHDR* pNMHDR, LRESULT* pResult) 
{
	int index = m_pages.GetNextItem (-1, LVNI_SELECTED);
	if (index >= 0 && index < m_pages.GetItemCount ())
		OnPageModify ();
	
	*pResult = 0;
}

BOOL CCustom2Dlg::OnToolTipText(UINT nId, NMHDR* pNMHDR, LRESULT* pResult)
{
	*pResult = 0;
	TOOLTIPTEXTA *pTTTA = (TOOLTIPTEXTA *)pNMHDR;
	TOOLTIPTEXTW *pTTTW = (TOOLTIPTEXTW *)pNMHDR;

	UINT nID = pNMHDR->idFrom - IDC_PAGE_NEW + IDS_CUSTOM2_PAGE_NEW_TIP;
	if (pNMHDR->code == TTN_NEEDTEXTA || pNMHDR->code == TTN_NEEDTEXTW)
	{
		CString strTipText;
		strTipText.LoadString (nID);
		static CHAR szBuffer[1000];
		static WCHAR wszBuffer[1000];
		if (pNMHDR->code == TTN_NEEDTEXTA)
		{
			lstrcpy (szBuffer, strTipText);
			pTTTA->lpszText = szBuffer;
		}
		else
		{
			_mbstowcsz (wszBuffer, strTipText, strTipText.GetLength () + 1);
			pTTTW->lpszText = wszBuffer;
		}	
	}
	return (FALSE);
}